/*
 * AtendimentoFacade.java
 *
 * Created on October 29, 2007, 9:06 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package petstore.business.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import petstore.business.IAtendimentoFacade;
import petstore.business.IComumFacade;
import petstore.model.Anamnese;
import petstore.model.Animal;
import petstore.model.Atendimento;
import petstore.model.ExameSolicitado;
import petstore.model.Pendencia;
import petstore.model.Pesagem;
import petstore.model.Receita;
import petstore.model.enumeration.SituacaoAtendimento;
import petstore.persistence.IGenericDAO;
import petstore.util.Util;

/**
 *
 * @author Tom Hayden
 */
public class AtendimentoFacade implements IAtendimentoFacade {

    private IGenericDAO genericDAO;
    private IComumFacade comumFacade;

    public void setGenericDAO(IGenericDAO genericDAO) {
        this.genericDAO = genericDAO;
    }

    public void setComumFacade(IComumFacade comumFacade) {
        this.comumFacade = comumFacade;
    }

    public void incluirAtendimento(Atendimento atendimento) {
        this.genericDAO.insert(atendimento);
    }

    public void alterarAtendimento(Atendimento atendimento) {
        this.genericDAO.update(atendimento);
    }

    public void excluirAtendimento(Atendimento atendimento) {
        this.comumFacade.ativarInativarBean(atendimento);
    }

    public void cancelarAtendimento(Atendimento atendimento) {
        atendimento.setSituacaoAtendimento(SituacaoAtendimento.DESISTIU);
        this.alterarAtendimento(atendimento);
    }

    public Atendimento getAtendimento(Integer id) {
        return (Atendimento) this.genericDAO.findById(Atendimento.class, id);
    }

    public List<Atendimento> listarAtendimentoAgendadoPorFuncionario(Integer idFuncionario, Date data) {
        Map params = new HashMap();
        params.put("idFuncionario", idFuncionario);
        params.put("situacaoAtendimento", SituacaoAtendimento.NAO_ATENDIDO);
        params.put("dataHoraAgendamento", data);
        return this.genericDAO.findByCriteria("SELECT a " +
                "FROM   Atendimento a " +
                "JOIN   a.funcionario f " +
                "WHERE  f.id = :idFuncionario " +
                "AND    a.situacaoAtendimento = :situacaoAtendimento " +
                "AND    a.dataHoraAgendamento >= :dataHoraAgendamento " +
                "AND    a.active = true " +
                "ORDER BY a.dataHoraAgendamento", params);
    }

    public List<Atendimento> listarAtendimentoPorFuncionario(Integer idFuncionario, Date data) {
        Map params = new HashMap();
        params.put("idFuncionario", idFuncionario);
        params.put("dataHoraAgendamento", data);
        return this.genericDAO.findByCriteria("SELECT a " +
                "FROM   Atendimento a " +
                "JOIN   a.funcionario f " +
                "WHERE  f.id = :idFuncionario " +
                "AND    a.dataHoraAgendamento >= :dataHoraAgendamento " +
                "AND    a.active = true " +
                "ORDER BY a.dataHoraAgendamento", params);
    }

    public void realizarAtendimento(Atendimento atendimento) {
        atendimento.setSituacaoAtendimento(SituacaoAtendimento.ATENDIDO);
        atendimento.setDataHoraAtendimento(Util.dateAndTime());
        this.alterarAtendimento(atendimento);
    }

    public Integer incluirAnamnese(Anamnese anamnese) {
        return this.genericDAO.insert(anamnese);
    }
    
    public Integer alterarAnamnese(Anamnese anamnese) {
        return this.genericDAO.update(anamnese);
    }

    public Anamnese getAnamnese(Integer id) {
        return (Anamnese) this.genericDAO.findById(Anamnese.class, id);
    }
    
    public List<Anamnese> listarAnamnesePorAnimal(Animal animal) {
        Map params = new HashMap();
        params.put("idAnimal", animal.getId());
        return this.genericDAO.findByCriteria("SELECT a " +
                "FROM   Anamnese a " +
                "WHERE  a.animal.id = :idAnimal " +
                "ORDER BY a.dataAnamnese DESC", params);
    }
    
    public Integer incluirExameSolicitado(ExameSolicitado exameSolicitado) {
        return this.genericDAO.insert(exameSolicitado);
    }

    public Integer alterarExameSolicitado(ExameSolicitado exameSolicitado) {
        return this.genericDAO.update(exameSolicitado);
    }

    public ExameSolicitado getExameSolicitado(Integer id) {
        return (ExameSolicitado) this.genericDAO.findById(ExameSolicitado.class, id);
    }

    public List<ExameSolicitado> listarExameSolicitadoPorAnimal(Animal animal) {
        Map params = new HashMap();
        params.put("idAnimal", animal.getId());
        return this.genericDAO.findByCriteria("SELECT e " +
                "FROM   ExameSolicitado e " +
                "WHERE  e.animal.id = :idAnimal " +
                "ORDER BY e.dataSolicitacao DESC", params);
    }

    public Integer incluirPesagem(Pesagem pesagem) {
        return this.genericDAO.insert(pesagem);
    }

    public Integer alterarPesagem(Pesagem pesagem) {
        return this.genericDAO.update(pesagem);
    }

    public Pesagem getPesagem(Integer id) {
        return (Pesagem) this.genericDAO.findById(Pesagem.class, id);
    }

    public List<Pesagem> listarPesagemPorAnimal(Animal animal) {
        Map params = new HashMap();
        params.put("idAnimal", animal.getId());
        return this.genericDAO.findByCriteria("SELECT p " +
                "FROM   Pesagem p " +
                "WHERE  p.animal.id = :idAnimal " +
                "ORDER BY p.dataPesagem DESC", params);
    }

    public Integer incluirReceita(Receita receita) {
        return this.genericDAO.insert(receita);
    }

    public Integer alterarReceita(Receita receita) {
        return this.genericDAO.update(receita);
    }

    public Receita getReceita(Integer id) {
        return (Receita) this.genericDAO.findById(Receita.class, id);
    }

    public List<Receita> listarReceitaPorAnimal(Animal animal) {
        Map params = new HashMap();
        params.put("idAnimal", animal.getId());
        return this.genericDAO.findByCriteria("SELECT r " +
                "FROM   Receita r " +
                "WHERE  r.animal.id = :idAnimal " +
                "ORDER BY r.dataReceita DESC", params);
    }

    public Integer incluirPendencia(Pendencia pendencia) {
        return this.genericDAO.insert(pendencia);
    }

    public Integer alterarPendencia(Pendencia pendencia) {
        return this.genericDAO.update(pendencia);
    }

    public Pendencia getPendencia(Integer id) {
        return (Pendencia) this.genericDAO.findById(Pendencia.class, id);
    }

    public List<Pendencia> listarPendenciaPorAnimal(Animal animal) {
        Map params = new HashMap();
        params.put("idAnimal", animal.getId());
        return this.genericDAO.findByCriteria("SELECT p " +
                "FROM   Pendencia p " +
                "WHERE  p.animal.id = :idAnimal " +
                "ORDER BY p.dataPendencia DESC", params);
    }

}
